
/*
 * Diese Methode gibt die Länge der Liste zuück
 */
def listLength( list: List[Int] ): Int = {
  
  list match{
    
    case Nil	=>	0
    
    case x::xs	=> listLength(xs) + 1
  }

}

/*
 * 
 * Bsp.:	Eingabe		List(1,2,3,4)
 * 			Rückgabe	List(4,3,2,1)
 */
def listReverse(list: List[Int] ): List[Int] = {

	list match {

		case	Nil		=> 	Nil

		case	x::xs	=>	listReverse(xs):::List(x)

	}
}

/* Wir brauchen eine weitere Methode für listRemoveN
  	 die zusätzlch eine Variable enthält die Aufzählt 
  	 in welchen Listenelement wir uns befinden. 
  	 
  	 list: 	die Liste
  	 n:		das n-te Element das nicht dabei sein soll
  	 d:		der Zähler
  */
def listRemoveNInner( list:List[Int], n:Int, d:Int): List[Int] = {
  
  list match{
    
    // falls die Liste leer ist, dann beenden wir somit die Rekrusion
    case Nil => List()
    
 
    case x::xs =>	// so kriegen wir heraus ob der zähler 
    				// auf eine (n*i)-tes element gestoßen ist
      				if(( d%n ) == 0) {
    							
    							listRemoveNInner(xs, n, d+1)
    				}else{
    							x::listRemoveNInner(xs, n, d+1)
    				}
  }
  

}

/*
 * Diese Methode gibt uns eine Liste zurück 
 * die alle Inhalte hat außer jede (n*i)-tes Element
 * 
 * Bsp.:	Eingabe		listRomoveN(List(1,2,3,4), 2)
 * 			Rückgabe	List(1,3)
 */
def listRemoveN(list:List[Int], n:Int ): List[Int] = {
  
  listRemoveNInner(list, n, 1)
}


/*
 * Eine zusätzliche Methode für listCopyd 
 * um 2 weitere Parameter zu haben
 * 
 * isCopy:	sagt aus ob der aktuelle Element schon kopiert ist
 */
def listCopydInner(list:List[Int], isCopy:Boolean): List[Int] = {
  
  list	match{
    
    case Nil	=>	List()
    
    case x::xs	=>	if(isCopy != true){
    					
    					x::listCopydInner(list, true)
    					
    				}else{
    					
    					x::listCopydInner(xs, false)
    					
    				}
  }
}

/*
 * Diese Methode erstellt eine Liste 
 * die jedes Element in der gegebenen Parameterliste kopiert
 * 
 * Bsp.:	Eingabe		List(1,2,3,4)
 * 			Rückgabe	List(1,1,2,2,3,3,4,4)
 */
def listCopyd(list:List[Int]): List[Int] = {
  
  listCopydInner(list, false)
  
}

///*
// * 
// */
//def listNListInner(list:List[Int], n:Int,  d:Int): List[List[Int]] = {
//  
//  list	match {
//    
//    case Nil	=>	List()
//    
//    case x::xs	=>	if(n != 0){
//    			
//      					List[List[Int]](d) = x::listNListInner(list, n-1, d)
//      					
//    				}else{
//    				  
//    					if(xs == Nil){
//    					  
//    						Nil
//    					}else{
//    					  
//    					  listNListInner(xs, list(d+1), d+1)
//    					}
//    				}
//  }
//}
//
//def listNList(list:List[Int]): List[List[Int]] = {
//  
//  if(list == Nil){
//    					  
//    	Nil
//    	
//   }else{
//    					  
//	   listNListInner(list, list(0), 0)
//    }
//
//}